package com.sanyou.service;

import com.sanyou.enums.IsOk;
import com.sanyou.pojo.CopperParticleCheckRecord;
import com.sanyou.pojo.exceptions.CacheException;
import com.sanyou.pojo.vo.CopperParticleHistoryVo;
import com.sanyou.pojo.vo.CopperParticleReqVo;
import com.sanyou.pojo.vo.CopperParticleResVo;
import com.sanyou.utils.PagedResult;

import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.*;

/**
 * 铜粒子相关功能模块
 * @Author xhy
 * @Date 2022/11/2
 */
public interface CopperParticleService {
    /**
     * 插入铜粒子检测记录
     * @param record
     */
    public void insertRecord(CopperParticleCheckRecord record) throws Exception;

    /**
     * 批量插入铜粒子检测记录
     * @param records
     */
    public void insertRecords(List<CopperParticleCheckRecord> records) throws Exception;


    /**
     * 插入铜粒子检测记录到缓存数据库
     * @param record
     */
    public void insertRecordToCache(CopperParticleCheckRecord record) throws Exception;

    /**
     * 获取缓存中目标设备所产生的所有铜粒子检测记录
     * 缓存中只存在当天的数据
     * @param deviceNo
     * @return
     */
    public List<CopperParticleCheckRecord> getAllRecordsFromCache(String deviceNo);

    /**
     * 条件查询
     * @param deviceNo 设备编号
     * @param isOk null代表同时搜索合格与不合格的记录；OK搜索合格记录；NG搜索不合格记录
     * @param productNo 产品编号(非空，模糊匹配)，空字符串时表示匹配所有阴极板编号
     * @return
     */
    /**
     *
     * @param deviceNo 设备编号
     * @param isOk null代表同时搜索合格与不合格的记录；OK搜索合格记录；NG搜索不合格记录
     * @param productNo 产品编号(非空，模糊匹配)，空字符串时表示匹配所有阴极板编号
     * @param particleType 例子类型(非空，精确匹配)，空字符串时表示匹配所有阴极板编号
     * @return
     * @throws CacheException
     */
    public List<CopperParticleCheckRecord> getAllRecordsFromCache(String deviceNo, IsOk isOk, String productNo,String particleType)throws CacheException;

    /**
     * 根据 deviceNo,isOk,productNo,particleType构建临时表后返回表长
     */
    public long getAllRecordsFromCacheLength(String deviceNo,IsOk isOk,String productNo,String particleType) throws  Exception;

    /**
     * 根据以下条件进行缓存分页查询
     * @param deviceNo
     * @param isOk
     * @param productNo
     * @param particleType
     * @param page
     * @param pageSize
     * @return
     * @throws CacheException
     */
    public PagedResult getAllRecordsFromCache(String deviceNo, IsOk isOk, String productNo,String particleType,int page,int pageSize)throws CacheException;
    /**
     * 获取原始数据页面数据
     */
    CopperParticleResVo getList(CopperParticleReqVo copperParticleCheckRecordReqVo, Integer size, Integer page) throws Exception;

    /**
     * 获取原始数据不合格板数
     */
    Long getUnqualifiedCopperNum(String deviceNo, LocalDate startTime) throws Exception;

    /**
     * 获取原始数据合格板数
     */
    Long getQualifiedCopperNum(String deviceNo, LocalDate startTime) throws Exception;

    LocalDate date2LocalDate(Date date);

    /**
     * @description: 获取Redis 时间-数量分布
     * @param DeviceNo
     * @return: java.util.Map<java.lang.Integer,java.lang.Integer>
     * @author: chase
     * @time: 2022/11/16 下午2:15
     */
    Map<Integer,Integer> getRtTimeDistribution(String DeviceNo);


    /**
     * @description: 获取DataBase 时间-数据分布
     * @param deviceNo
     * @return: java.util.Map<java.lang.Integer,java.lang.Integer>
     * @author: chase
     * @time: 2022/11/16 下午2:15
     */
    Map<Integer, Integer> getHisTimeDistribution(String deviceNo, Date startTime);

    /**
     * 获取铜粒子历史数据
     * @param subFactoryNo 车间号
     * @param startDate 起始日期
     * @param endDate 结束日期
     * @param interval 统计周期
     * @return
     */
    public List<CopperParticleHistoryVo> getHistoryList(String subFactoryNo, Date startDate, Date endDate, Integer interval);

    /**
     * 获取每条铜粒子历史数据
     * @param subFactoryNo 车间号
     * @param startDate 起始日期
     * @param endDate 结束日期
     * @param size 每页个数
     * @param page 第几页
     */
    PagedResult listHistoryRecord(String subFactoryNo, Date startDate, Date endDate, Integer size, Integer page);

    /**
     *  获取铜粒子实时数据长度
     */
    public long getAllRecordsFromCacheLength(String deviceNo,IsOk isOk) throws Exception;

    /**
     * 判断该条记录是否为合格
     * @param record
     * @return
     */
    public boolean recordIsOk(CopperParticleCheckRecord record);

    /**
     * 持久化date参数对应那一天所产生的铜粒子检测数据
     * @param date 只精确到年月日即可
     */
    public void persistDataOfYesterday(Date date);

    /**
     * 添加阴极板编号的索引
     */
    public void addIndexOfProductNo(String productNo,String field) throws Exception;

    /**
     * 从缓存中获取目标阴极板相关的铜粒子检测信息
     * @param productNo
     * @return
     */
    public CopperParticleCheckRecord getRecordFromCache(String productNo);

    /**
     * 根据条件获取在startTime~endTime之间的铜粒子检测记录
     * @param deviceNo
     * @param startTime
     * @param endTime
     * @param isOk 为空时表示不考虑此条件
     * @param productNo 为空时表示不考虑此条件
     * @param particleType 为空时表示不考虑此条件
     * @return
     */
    public List<CopperParticleCheckRecord> getCopperParticleRecords(String deviceNo, Date startTime,Date endTime, IsOk isOk, String productNo,String particleType);

    /**
     * 根据条件获取在startTime~endTime之间的铜粒子检测记录
     * @param deviceNo
     * @param startTime
     * @param endTime
     * @param isOk 为空时表示不考虑此条件
     * @return
     */
    public List<CopperParticleCheckRecord> getCopperParticleRecords(String deviceNo, Date startTime,Date endTime, IsOk isOk);

    /**
     * 根据条件获取在startTime~endTime之间的铜粒子检测记录
     * @param deviceNo
     * @param startTime
     * @param endTime
     * @return
     */
    public List<CopperParticleCheckRecord> getCopperParticleRecords(String deviceNo, Date startTime,Date endTime);


    /**
     * 根据条件分页获取在startTime~endTime之间的铜粒子检测记录
     * @param deviceNo
     * @param startTime
     * @param endTime
     * @param isOk 为空时表示不考虑此条件
     * @param productNo 为空时表示不考虑此条件
     * @param particleType 为空时表示不考虑此条件
     * @return
     */
    public PagedResult getCopperParticleRecords(String deviceNo, Date startTime,Date endTime, IsOk isOk, String productNo,String particleType,int page,int pageSize);


    /**
     * 根据条件分页获取在startTime~endTime之间的铜粒子检测记录
     * @param deviceNo
     * @param startTime
     * @param endTime
     * @param isOk 为空时表示不考虑此条件
     * @return
     */
    public PagedResult getCopperParticleRecords(String deviceNo, Date startTime,Date endTime, IsOk isOk,int page,int pageSize);

    /**
     * 根据条件分页获取在startTime~endTime之间的铜粒子检测记录
     * @param deviceNo
     * @param startTime
     * @param endTime
     * @return
     */
    public PagedResult getCopperParticleRecords(String deviceNo, Date startTime,Date endTime,int page,int pageSize);

    /**
     * 根据条件分页获取今天的铜粒子检测记录
     * @param deviceNo
     * @param isOk
     * @param productNo
     * @param particleType
     * @param page
     * @param pageSize
     * @return
     */
    public PagedResult getCopperParticleRecordsOfToday(String deviceNo, IsOk isOk, String productNo,String particleType,int page,int pageSize);

    /**
     * 根据条件分页获取今天的铜粒子检测记录
     * @param deviceNo
     * @param isOk
     * @param productNo
     * @param particleType
     * @return
     */
    public List<CopperParticleCheckRecord> getCopperParticleRecordsOfToday(String deviceNo, IsOk isOk, String productNo,String particleType);

    /**
     * 更新铜粒子检测记录的阴极板编号
     * @param recordId
     * @param newProductNo
     */
    public void updateProductNoOfCopperParticleCheckRecord(Long recordId, String newProductNo) throws Exception;
}
